using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SplitAnimController : MonoBehaviour
{
    // ================== 公开参数 ==================
    [Header("移动设置")]
    [Tooltip("需要移动的起始物体列表（建议保持与目标物体列表数量一致）")]
    public List<Transform> startTransforms; // 起始物体列表
    
    [Tooltip("目标位置的物体列表（建议保持与起始物体列表数量一致）")]
    public List<Transform> targetTransforms; // 目标物体列表
    
    [Range(0.1f, 10f), Tooltip("单次移动完成所需时间（单位：秒）")]
    public float moveDuration = 2f; // 单次移动耗时
    
    [Tooltip("速度变化曲线（X轴：0-1表示进度，Y轴：0-1表示插值比例）")]
    public AnimationCurve speedCurve = AnimationCurve.EaseInOut(0, 0, 1, 1); // 默认缓动曲线
    
    [Tooltip("是否自动循环移动（到达目标后自动返回）")]
    public bool loopMovement = true; // 是否循环移动
    
    [Range(0.1f, 10f), Tooltip("到达目标位置后的停留时间（单位：秒）")]
    public float stayDuration = 1f; // 停留时间
    
    [Tooltip("是否启用到达目标后的停留功能")]
    public bool enableStay = true; // 是否启用停留

    // ================== 私有变量 ==================
    private List<Vector3> initialPositions = new List<Vector3>();  // 存储起始物体的初始位置
    private List<Quaternion> initialRotations = new List<Quaternion>(); // 存储起始物体的初始旋转
    private Coroutine moveCoroutine; // 移动协程控制器

    // ================== 生命周期方法 ==================
    void Start()
    {
        // 初始化校验
        if (!ValidateTransforms()) return;
        
        // 存储初始状态
        StoreInitialTransforms();
        
        // 启动移动协程
        StartMovement();
    }

    /// <summary>
    /// 验证Transform列表有效性
    /// </summary>
    /// <returns>校验是否通过</returns>
    bool ValidateTransforms()
    {
        // 检查起始物体与目标物体数量是否匹配
        if (startTransforms.Count != targetTransforms.Count)
        {
            Debug.LogError("起始物体与目标物体数量不一致！");
            return false;
        }
        return true;
    }

    /// <summary>
    /// 存储所有起始物体的初始变换状态
    /// </summary>
    void StoreInitialTransforms()
    {
        foreach (var trans in startTransforms)
        {
            // 记录初始位置
            initialPositions.Add(trans.position);
            // 记录初始旋转
            initialRotations.Add(trans.rotation);
        }
    }

    // ================== 公有方法 ==================
    /// <summary>
    /// 启动/重启移动过程
    /// </summary>
    public void StartMovement()
    {
        // 停止现有移动协程
        if (moveCoroutine != null) StopCoroutine(moveCoroutine);
        
        // 启动新的移动协程
        moveCoroutine = StartCoroutine(MoveObjects());
    }

    // ================== 协程控制 ==================
    /// <summary>
    /// 物体移动协程主逻辑
    /// </summary>
    IEnumerator MoveObjects()
    {
        do
        {
            float timer = 0f; // 移动计时器
            
            // 正向移动阶段（从起始位置到目标位置）
            while (timer < moveDuration)
            {
                timer += Time.deltaTime; // 累计时间
                float progress = Mathf.Clamp01(timer / moveDuration); // 计算标准化进度
                float curveValue = speedCurve.Evaluate(progress); // 应用速度曲线

                // 遍历所有需要移动的物体
                for (int i = 0; i < startTransforms.Count; i++)
                {
                    // 空引用检查
                    if (startTransforms[i] == null || targetTransforms[i] == null) continue;

                    // 使用Lerp进行位置插值
                    startTransforms[i].position = Vector3.Lerp(
                        initialPositions[i], // 起始位置
                        targetTransforms[i].position, // 目标位置
                        curveValue // 插值比例
                    );

                    // 使用Slerp进行旋转插值（保持角度插值平滑）
                    startTransforms[i].rotation = Quaternion.Slerp(
                        initialRotations[i], // 起始旋转
                        targetTransforms[i].rotation, // 目标旋转
                        curveValue // 插值比例
                    );
                }
                yield return null; // 等待下一帧
            }

            // 循环移动逻辑
            if (loopMovement)
            {
                // 停留阶段处理
                if (enableStay)
                {
                    yield return new WaitForSeconds(stayDuration); // 等待停留时间
                }
                
                SwapTargets(); // 交换起始和目标位置
            }

        } while (loopMovement); // 循环条件检查
    }

    // ================== 辅助方法 ==================
    /// <summary>
    /// 交换起始位置和目标位置
    /// </summary>
    void SwapTargets()
    {
        // 交换列表引用
        List<Transform> temp = startTransforms;
        startTransforms = targetTransforms;
        targetTransforms = temp;

        // 清空原有初始状态
        initialPositions.Clear();
        initialRotations.Clear();
        
        // 重新存储新的初始状态
        StoreInitialTransforms();
    }

    // ================== 禁用处理 ==================
    void OnDisable()
    {
        // 停止正在运行的协程
        if (moveCoroutine != null) 
        {
            StopCoroutine(moveCoroutine);
            moveCoroutine = null; // 释放引用
        }
    }
}